module RPG
  class TilesetVX
    attr_accessor :name
    attr_accessor :bitmapNames
    attr_accessor :passages
    attr_accessor :terrainTags
    def initialize(name,bitmapNames,passages)
      @name=name
      @bitmapNames=bitmapNames
      @passages=passages
      @terrainTags=Table.new(0x2000)
    end
  end
end

def loadTileset(name)
  begin
    return Cache.load_bitmap("Graphics/Tilesets/",name)
  rescue RGSSError, Errno::ENOENT
    return Cache.system(name)
  end
end

def pbGetTileset
    if !$data_map_tilesets
     begin
       $data_map_tilesets=load_data("Data/MapTilesets.rvdata")
     rescue
       $data_map_tilesets=nil
     end
    end
    if !$data_tilesets
     begin
       $data_tilesets=load_data("Data/Tilesets.rvdata")
     rescue
       $data_tilesets=nil
     end
    end
    tileset=nil
    if $data_map_tilesets && $data_tilesets
      mapset=$data_map_tilesets[$game_map.map_id]
      tileset=$data_tilesets[mapset] if mapset && mapset>0
    end
    return tileset
end

class Game_Map
  attr_accessor :terrain_tags
  attr_accessor :passages
  def terrain_tag(x,y)
    if @map_id != 0 && @terrain_tags
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return 0
        elsif @terrain_tags[tile_id] && @terrain_tags[tile_id] > 0
          return @terrain_tags[tile_id]
        end
      end
    end
    return 0
  end
end

class Sprite_Character
  def tileset_bitmap(tile_id)
    set_number = tile_id / 256
    tileset=pbGetTileset
    if tileset
      return loadTileset(tileset.bitmapNames[5]) if set_number == 0
      return loadTileset(tileset.bitmapNames[6]) if set_number == 1
      return loadTileset(tileset.bitmapNames[7]) if set_number == 2
      return loadTileset(tileset.bitmapNames[8]) if set_number == 3
    else
      return Cache.system("TileB") if set_number == 0
      return Cache.system("TileC") if set_number == 1
      return Cache.system("TileD") if set_number == 2
      return Cache.system("TileE") if set_number == 3
    end
    return nil
  end
end

class Spriteset_Map
  def create_tilemap
    @tilemap = Tilemap.new(@viewport1)
    tileset=pbGetTileset
    if tileset
      @tilemap.bitmaps[0] = loadTileset(tileset.bitmapNames[0])
      @tilemap.bitmaps[1] = loadTileset(tileset.bitmapNames[1])
      @tilemap.bitmaps[2] = loadTileset(tileset.bitmapNames[2])
      @tilemap.bitmaps[3] = loadTileset(tileset.bitmapNames[3])
      @tilemap.bitmaps[4] = loadTileset(tileset.bitmapNames[4])
      @tilemap.bitmaps[5] = loadTileset(tileset.bitmapNames[5])
      @tilemap.bitmaps[6] = loadTileset(tileset.bitmapNames[6])
      @tilemap.bitmaps[7] = loadTileset(tileset.bitmapNames[7])
      @tilemap.bitmaps[8] = loadTileset(tileset.bitmapNames[8])
      $game_map.passages = tileset.passages
      $game_map.passages[0] = 0x10
      $game_map.terrain_tags = tileset.terrainTags
    else
      @tilemap.bitmaps[0] = Cache.system("TileA1")
      @tilemap.bitmaps[1] = Cache.system("TileA2")
      @tilemap.bitmaps[2] = Cache.system("TileA3")
      @tilemap.bitmaps[3] = Cache.system("TileA4")
      @tilemap.bitmaps[4] = Cache.system("TileA5")
      @tilemap.bitmaps[5] = Cache.system("TileB")
      @tilemap.bitmaps[6] = Cache.system("TileC")
      @tilemap.bitmaps[7] = Cache.system("TileD")
      @tilemap.bitmaps[8] = Cache.system("TileE")
      $game_map.terrain_tags = nil
    end
    @tilemap.passages = $game_map.passages
    @tilemap.map_data = $game_map.data
  end
end
